ES Modules支持
ES Modules 支持的关键版本
版本 | 描述 |
---|---|
v12.0.0 | 首次实验性支持 ES Modules,需通过 --experimental-modules 标志启用。 |
v13.2.0 | 默认支持 package.json 的 "type": "module" 配置,允许项目级 ES Modules 自动启用。 |
v14.0.0 | 改进 ES Modules 加载器(仍为实验性),支持 import /export 语法。 |
v16.0.0 | 移除 --experimental-modules 标志,ES Modules 默认启用(基于 package.json 的配置)。 |
v18.0.0 | ES Modules 标记为稳定功能,完全移除实验性标志。 |
后缀名变化
- Node.js 12+:初步支持 ESM,但需实验性标志
- Node.js 13.2.0:引入
type: "module"
配置和.mjs/.cjs
扩展名 - Node.js 14.0.0+:默认启用 ESM,支持
.mjs
和.cjs
的显式模块类型 - Node.js 18.0.0:ESM 标记为稳定功能,移除实验性标志
后缀名 | 模块类型 | 技术栈 | 版本支持与引入历史 | 主要用途与特性 | 注意事项 |
---|---|---|---|---|---|
.js | 动态解析 | Node.js | 所有版本均支持 默认解析规则由 package.json 的 type 字段决定(module /commonjs ) | - 无显式扩展名时,根据父级 type 字段判定模块类型 - 兼容旧版 CommonJS 项目 | 混用 ESM 语法时需显式声明 .mjs 或配置 type: "module" |
.mjs | ESM | Node.js | 从 Node.js 12.0.0 开始实验性支持 Node.js 14.0.0 后默认启用 | - 显式标记为 ES 模块 - 支持 import/export 语法 - 支持顶层 await | 浏览器和 Node.js 均兼容,但部分工具链(如 Webpack)需额外配置 |
.cjs | CommonJS | Node.js | 从 Node.js 13.2.0 引入 | - 显式标记为 CommonJS 模块 - 兼容 require/module.exports 语法 | 与 ESM 互操作时需使用动态 import() |
.mts | ESM (TS) | TypeScript | 从 TypeScript 4.5 引入 | - TypeScript 的 ESM 源码文件 - 编译为 .mjs - 支持严格的 ES 模块语法检查 | 需配置 module: "nodenext" 或 esnext |
.cts | CommonJS (TS) | TypeScript | 从 TypeScript 4.5 引入 | - TypeScript 的 CommonJS 源码文件 - 编译为 .cjs - 兼容传统 require 语法 | 混合项目需注意声明文件生成路径 |
.d.ts | 类型声明 | TypeScript | 所有版本均支持 | - 声明文件用于类型提示 - 可扩展第三方模块类型(通过声明合并或全局增强) | 需与源码文件同名或在 types 目录中 |
场景 | 解决方案 | 相关技术栈/工具 |
---|---|---|
ESM 导入 CommonJS | 使用默认导入:import pkg from 'cjs-module.cjs' 或动态 import() | Node.js ≥14.0.0, TypeScript ≥4.5 |
CommonJS 导入 ESM | 仅支持动态 import() ,无法使用 require | Node.js ≥13.2.0 |
TS 编译为混合模块 | 配置 tsconfig.json 的 module 和 moduleResolution 字段(如 nodenext ) | TypeScript ≥4.7 |
路径扩展名重写 | 启用 --rewriteRelativeImportExtensions (TypeScript 5.7+) | 适用于直接运行 TS 的运行时(如 Bun、Deno) |